#pragma once 

#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include <stdio.h>
#include <unistd.h>

//工具类
class Util
{
public:
    //将读取的行内容拿走
    static int ReadLine(int sock, std::string&out)
    {
        char ch = 'X';
        while (ch!='\n')
        {
            //以阻塞方式将sock缓冲区中的数据读到ch中
            ssize_t s = recv(sock,&ch,1,0);
            if(s>0)
            {
                //\r->\n | \r\n -> \n
                if(ch == '\r')
                {
                    //利用recv的MSG_PEEK向后窥探功能，查看后面是否还存在数据
                    recv(sock,&ch,1,MSG_PEEK);
                    if(ch=='\n')
                    {
                        //窥探成功，字符一定存在
                        recv(sock,&ch,1,0);
                    }
                    else
                    {
                        ch = '\n';
                    }
                }
                out.push_back(ch);
            }
            else if(s==0)
            {
                return 0;
            }
            else 
            {
                return -1;
            }
        }
        return out.size();
    }

    //字符串按照特定的符号进行切割（目标，个数，输出，分隔符）
    static bool CutString(const std::string&target , std::string & sub1_out,std::string&sub2_out,std::string sep)
    { 
        size_t pos = target.find(sep);//找到分隔符的下标
        if(pos!=std::string::npos)
        {
            sub1_out = target.substr(0,pos);
            sub2_out = target.substr(pos+sep.size());
            return true;
        }
        return false;
    }

};